<?php
namespace Api\Model;

use Think\Model;

class PicCaculateModel extends Model {
    /*
	*挖图
	*参数： string  source  原图路径  target  目标存放路径
	*（都包含扩展名其中目标路径必须为png）
    *参数 int   filter    1~5红色图章  6~10蓝色图章  11~15黑色系图章
    *挖图敏感度由高到低；敏感度低容差大
	*/
    public function picCavern($source,$target,$filter=1)
    {
        //设置过滤器
        switch($filter){
            case 1:$rV=160;$otherV=160;break;
            case 2:$rV=120;$otherV=70;break;
            case 3:$rV=150;$otherV=60;break;
            case 4:$rV=200;$otherV=50;break;
            case 5:$rV=225;$otherV=40;break;
            //蓝色系过滤器
            case 6:$bV=100;$otherV=50;break;
            case 7:$bV=150;$otherV=60;break;
            case 8:$bV=200;$otherV=70;break;
            case 9:$bV=210;$otherV=80;break;
            case 10:$bV=225;$otherV=90;break;
            //黑色系
            case 11:$rV=$gV=$bV=40;break;
            case 12:$rV=$gV=$bV=50;break;
            case 13:$rV=$gV=$bV=60;break;
            case 14:$rV=$gV=$bV=80;break;
            case 15:$rV=$gV=$bV=100;break;
        }
        $srcSize=$this->getPicSize($source);
        $srcW=$srcSize[0];
        $srcH=$srcSize[1];
        $srcType=$this->getPicType($source);
        $bgImg=$this->getImg($source);//原图
        $white=imagecolorallocate($bgImg,255,255,255);//指定白色为需要干掉的

        for($x=0;$x<$srcW;$x++){
            for($y=0;$y<$srcH;$y++){
                $rgb=imagecolorat($bgImg,$x,$y);
                $currentPix=imagecolorsforindex($bgImg,$rgb);//取得当前像素 rgb  和 alpha通道值
                //var_dump($currentPix);
                /*$r=($rgb>>16)&0xFF;//按位右移内存获取rgb的单独颜色值
                $g=($rgb>>8)&0xFF;
                $b=$rgb&0xFF;*/
                $r=$currentPix['red'];//红色系
                $g=$currentPix['green'];//绿色系
                $b=$currentPix['blue'];//蓝色系
                $alpha=$currentPix['alpha'];//α通道
                if($alpha>=118){//如果是接近透明色
                    imagefill($bgImg,$x,$y,$white); //在透明图层上覆盖填充需要干掉的颜色
                }else{//如果不透明则判断色系
                    if($filter>0&&$filter<6){//红色系
                        if(!($r>=$rV&&$g<=$otherV&&$b<=$otherV)){
                            imagefill($bgImg,$x,$y,$white); //在其他杂色上覆盖填充需要干掉的颜色
                        }
                    }elseif($filter>=6&&$filter<=10){//蓝色系
                        if(!($b>=$bV&&$r<=$otherV&&$g<=$otherV)){
                            imagefill($bgImg,$x,$y,$white); //在其他杂色上覆盖填充需要干掉的颜色
                        }
                    }elseif($filter>10&&$filter<=15){//黑色系
                        if(!($r<=$rV&&$g<=$gV&&$b<=$bV)){
                            imagefill($bgImg,$x,$y,$white); //在其他杂色上覆盖填充需要干掉的颜色
                        }
                    }
                }
            }
        }
        imagecolortransparent($bgImg,ImageColorAllocate($bgImg,255,255,255));//去掉白色
        header('content-type:image/png');
        imagepng($bgImg,$target);
        imagedestroy($bgImg);
    }

    /*
    *获取图片尺寸
    */
    private function getPicSize($source){
        return  getimagesize($source);
    }

    /*
    *获取图片扩展名类型
    */
    private function getPicType($source){
        $pictype=$this->getPicSize($source);
        $pictype=explode('/',$pictype['mime']);
        $pictype=$pictype[1];
        return $pictype;
    }

    /*
    *图片创建至内存
    */
    private function getImg($source){
        $stype=$this->getPicType($source);
        switch($stype){
            case 'gif':$simg=imagecreatefromgif($source);break;
            case 'jpeg':$simg=imagecreatefromjpeg($source);break;
            case 'png':$simg=imagecreatefrompng($source);break;
        }
        return $simg;
    }
}
// $pic=new pic();

// $pic->picCavern('123.jpg','456.png',2);